using RayDen.Library.Core.Primitives;
using RayDen.Library.Entity.Scene;

namespace RayDen.Library.Components.Surface
{
    public interface ISurfaceMaterial
    {

        TextureInfo AlphaTexture { get; }

        bool TransparentShadows { get; set; }
        string Name { get; set; }
        BrdfType Type { get; }
        BrdfClass Class { get; }
        float ContinuationProbability { get; }
        bool IsDiffuse();
        bool IsSpecular();
        bool IsRefractive();
        void f(ref Vector wo, ref Vector wi, ref Normal N, ref RgbSpectrum in_fs, out RgbSpectrum fs, BrdfType types = BrdfType.Diffuse);

        RgbSpectrum Sample_f(ref Vector wo, out Vector wi, ref Normal N, ref Normal shadeN, ref RgbSpectrum in_fs, float u0, float u1, float u2, ref SurfaceTextureData surfaceData, out float pdf, out BsdfEvent bsdfEvent);
        RgbSpectrum Sample_f(ref Vector wo, out Vector wi, ref Normal N, ref Normal shadeN, ref RgbSpectrum in_fs, float u0, float u1, float u2, ref SurfaceTextureData surfaceData, out float pdf, out bool specularBounce);
        float Pdf(ref Vector wo, ref Vector wi);


    }
}